{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "id": "7884751d-a6bd-4123-a501-b404eaa02257",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2023-07-06 15:08:46,197 - modelscope - INFO - PyTorch version 2.0.1+cu117 Found.\n",
      "2023-07-06 15:08:46,201 - modelscope - INFO - Loading ast index from /mnt/workspace/.cache/modelscope/ast_indexer\n",
      "2023-07-06 15:08:46,202 - modelscope - INFO - No valid ast index found from /mnt/workspace/.cache/modelscope/ast_indexer, generating ast index from prebuilt!\n",
      "2023-07-06 15:08:46,264 - modelscope - INFO - Loading done! Current index file version is 1.7.0, with md5 97a95dc2d7da943e1cea5484a79569dc and a total number of 861 components indexed\n",
      "2023-07-06 15:08:47,029 - modelscope - INFO - Use user-specified model revision: v1.0.6\n",
      "Downloading: 100%|██████████| 1.07k/1.07k [00:00<00:00, 208kB/s]\n",
      "Downloading: 100%|██████████| 199/199 [00:00<00:00, 34.1kB/s]\n",
      "Downloading: 100%|██████████| 2.30k/2.30k [00:00<00:00, 838kB/s]\n",
      "Downloading: 100%|██████████| 1.70G/1.70G [00:59<00:00, 30.9MB/s]\n",
      "Downloading: 100%|██████████| 1.83G/1.83G [01:11<00:00, 27.6MB/s]\n",
      "Downloading: 100%|██████████| 1.80G/1.80G [00:51<00:00, 37.2MB/s]\n",
      "Downloading: 100%|██████████| 1.69G/1.69G [01:14<00:00, 24.4MB/s]\n",
      "Downloading: 100%|██████████| 1.83G/1.83G [02:18<00:00, 14.2MB/s]\n",
      "Downloading: 100%|██████████| 1.80G/1.80G [01:57<00:00, 16.4MB/s]\n",
      "Downloading: 100%|██████████| 0.98G/0.98G [00:49<00:00, 21.4MB/s]\n",
      "Downloading: 100%|██████████| 20.0k/20.0k [00:00<00:00, 2.78MB/s]\n",
      "Downloading: 100%|██████████| 944/944 [00:00<00:00, 299kB/s]\n",
      "Downloading: 100%|██████████| 6.07k/6.07k [00:00<00:00, 1.57MB/s]\n",
      "Downloading: 100%|██████████| 995k/995k [00:00<00:00, 6.55MB/s]\n",
      "Downloading: 100%|██████████| 243/243 [00:00<00:00, 72.4kB/s]\n",
      "2023-07-06 15:18:50,092 - modelscope - INFO - initialize model from /mnt/workspace/.cache/modelscope/ZhipuAI/chatglm2-6b\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "[2023-07-06 15:18:50,257] [INFO] [real_accelerator.py:110:get_accelerator] Setting ds_accelerator to cuda (auto detect)\n",
      "WARNING:tensorflow:Deprecation warnings have been disabled. Set TF_ENABLE_DEPRECATION_WARNINGS=1 to re-enable them.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "2023-07-06 15:18:50.762611: I tensorflow/stream_executor/platform/default/dso_loader.cc:49] Successfully opened dynamic library libcudart.so.11.0\n",
      "The model weights are not tied. Please use the `tie_weights` method before using the `infer_auto_device` function.\n"
     ]
    },
    {
     "data": {
      "application/vnd.jupyter.widget-view+json": {
       "model_id": "1ec3f0e2e1024d48b89a5714067f2555",
       "version_major": 2,
       "version_minor": 0
      },
      "text/plain": [
       "Loading checkpoint shards:   0%|          | 0/7 [00:00<?, ?it/s]"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "The tokenizer class you load from this checkpoint is not the same type as the class this function is called from. It may result in unexpected tokenization. \n",
      "The tokenizer class you load from this checkpoint is 'ChatGLMTokenizer'. \n",
      "The class this function is called from is 'ChatGLM2Tokenizer'.\n",
      "2023-07-06 15:19:13,144 - modelscope - WARNING - No preprocessor field found in cfg.\n",
      "2023-07-06 15:19:13,145 - modelscope - WARNING - No val key and type key found in preprocessor domain of configuration.json file.\n",
      "2023-07-06 15:19:13,145 - modelscope - WARNING - Cannot find available config to build preprocessor at mode inference, current config: {'model_dir': '/mnt/workspace/.cache/modelscope/ZhipuAI/chatglm2-6b'}. trying to build by task and model information.\n",
      "2023-07-06 15:19:13,146 - modelscope - WARNING - No preprocessor key ('chatglm2-6b', 'chat') found in PREPROCESSOR_MAP, skip building preprocessor.\n",
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n",
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'response': '江南大学是中国一所著名的综合性大学,创建于1958年,是教育部和江苏省共建高校,也是“211工程”和“985工程”重点支持的高校之一。\\n\\n江南大学位于江苏省无锡市,拥有优美的校园环境和优良的学术氛围,占地面积1250余亩,建筑面积近100万平方米。学校设有26个学院,包括文学院、理学院、法学院、经学院、生命科学学院、医学院、药学院、新闻与传播学院、计算机学院、电子与电气工程学院、纺织与服装学院、艺术学院、经济管理学院、管理学院、法学院、马克思主义学院、教育科学学院、体育科学学院、园艺学院、医学院(筹)、金融学院、国际教育学院、师范学院等。\\n\\n江南大学在人才培养方面有着悠久的历史和辉煌的成就,被誉为“工程师和科学家培养的摇篮”。学校致力于培养具有国际视野和创新精神的优秀人才,为学生提供广泛的学科领域、丰富的教学资源和良好的实践机会。\\n\\n江南大学在科研方面也有着显著的成果,是中国科研型大学之一。学校拥有众多重点学科和实验室,为学生提供了广泛的研究和实践机会。', 'history': [('介绍下江南大学', '江南大学是中国一所著名的综合性大学,创建于1958年,是教育部和江苏省共建高校,也是“211工程”和“985工程”重点支持的高校之一。\\n\\n江南大学位于江苏省无锡市,拥有优美的校园环境和优良的学术氛围,占地面积1250余亩,建筑面积近100万平方米。学校设有26个学院,包括文学院、理学院、法学院、经学院、生命科学学院、医学院、药学院、新闻与传播学院、计算机学院、电子与电气工程学院、纺织与服装学院、艺术学院、经济管理学院、管理学院、法学院、马克思主义学院、教育科学学院、体育科学学院、园艺学院、医学院(筹)、金融学院、国际教育学院、师范学院等。\\n\\n江南大学在人才培养方面有着悠久的历史和辉煌的成就,被誉为“工程师和科学家培养的摇篮”。学校致力于培养具有国际视野和创新精神的优秀人才,为学生提供广泛的学科领域、丰富的教学资源和良好的实践机会。\\n\\n江南大学在科研方面也有着显著的成果,是中国科研型大学之一。学校拥有众多重点学科和实验室,为学生提供了广泛的研究和实践机会。')]}\n"
     ]
    }
   ],
   "source": [
    "from modelscope.utils.constant import Tasks\n",
    "from modelscope import Model\n",
    "from modelscope.pipelines import pipeline\n",
    "model = Model.from_pretrained('ZhipuAI/chatglm2-6b', device_map='auto', revision='v1.0.6')\n",
    "pipe = pipeline(task=Tasks.chat, model=model)\n",
    "inputs = {'text':'你好', 'history': []}\n",
    "result = pipe(inputs)\n",
    "inputs = {'text':'介绍下江南大学', 'history': result['history']}\n",
    "result = pipe(inputs)\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "id": "6ff13a14-3629-4550-9c40-80e2c7185a03",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'response': '中国四大名著指的是《红楼梦》、《水浒传》、《三国演义》、《西游记》。这四本书都是明清小说的代表作,对中国文学和文化产生了深远的影响。', 'history': [('中国四大名著是哪四本书?', '中国四大名著指的是《红楼梦》、《水浒传》、《三国演义》、《西游记》。这四本书都是明清小说的代表作,对中国文学和文化产生了深远的影响。')]}\n"
     ]
    }
   ],
   "source": [
    "inputs = {'text':'中国四大名著是哪四本书?', 'history': result['history']}\n",
    "result = pipe(inputs)\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "id": "e258508f-dc50-4384-848c-14445a34edb7",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'response': '地球围绕其自转轴旋转,同时也绕着太阳公转,这导致了昼夜交替和季节的变化。在地球自转轴倾斜23.5度的情况下,不同地区在不同的时间会暴露在太阳光线下,这导致了气温的变化,从而形成了四季的变化。\\n\\n在地球公转的过程中,太阳光的强度也会发生变化,这会影响到地球表面的温度。因此,在不同的时间,地球不同地区的气温和日照时间也会发生变化,从而形成了四季的变化。\\n\\n地球的自转和公转是导致四季变化的主要原因。', 'history': [('为什么会有春夏秋冬四季变化？', '地球围绕其自转轴旋转,同时也绕着太阳公转,这导致了昼夜交替和季节的变化。在地球自转轴倾斜23.5度的情况下,不同地区在不同的时间会暴露在太阳光线下,这导致了气温的变化,从而形成了四季的变化。\\n\\n在地球公转的过程中,太阳光的强度也会发生变化,这会影响到地球表面的温度。因此,在不同的时间,地球不同地区的气温和日照时间也会发生变化,从而形成了四季的变化。\\n\\n地球的自转和公转是导致四季变化的主要原因。')]}\n"
     ]
    }
   ],
   "source": [
    "inputs = {'text':'为什么会有春夏秋冬四季变化？', 'history': result['history']}\n",
    "result = pipe(inputs)\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "id": "1032f8fc-6645-4580-8f2d-329bbd730c37",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'response': '以下是一个用 Java 实现两个不同数据类型的 ArrayList 之间的内联查询的示例代码,其中内联字段是 \"name\":\\n\\n```java\\nimport java.util.ArrayList;\\n\\npublic class InlineQueryExample {\\n\\n    public static void main(String[] args) {\\n\\n        // 创建两个不同数据类型的 ArrayList\\n        ArrayList<String> stringList = new ArrayList<String>();\\n        ArrayList<Integer> integerList = new ArrayList<Integer>();\\n\\n        // 将字符串类型的 ArrayList 添加到另一个字符串类型的 ArrayList 中\\n        stringList.add(\"apple\");\\n        stringList.add(\"banana\");\\n        integerList.add(1);\\n        integerList.add(2);\\n\\n        // 查询字符串类型的 ArrayList 中包含 \"apple\" 的元素\\n        String result = stringList.stream().filter(str -> str.contains(\"apple\")).findFirst().orElse(\"没有找到该内联字段的数据\");\\n\\n        // 查询整数类型的 ArrayList 中包含 1 和 2 的元素\\n        int result2 = integerList.stream().filter(i -> i == 1 || i == 2).findFirst().orElse(null);\\n\\n        System.out.println(\"查询结果: \" + result);\\n        System.out.println(\"查询结果2: \" + result2);\\n    }\\n}\\n```\\n\\n在这个示例中,我们首先创建了两个不同数据类型的 ArrayList:`stringList` 和 `integerList`。然后,我们将字符串类型的 ArrayList 添加到另一个字符串类型的 ArrayList 中。\\n\\n接下来,我们使用 `stream()` 方法来创建一个查询字符串类型的 ArrayList 中包含 \"apple\" 的元素的 `StringFilter`。我们使用 `findFirst()` 方法来查找第一个元素,如果找不到该元素,则返回 \"没有找到该内联字段的数据\"。最后,我们使用 `orElse()` 方法来返回查询结果,如果找不到该内联字段的数据,则返回 `null`。\\n\\n然后,我们使用 `stream()` 方法来创建一个查询整数类型的 ArrayList 中包含 1 和 2 的元素的 `IntFilter`。我们使用 `findFirst()` 方法来查找第一个元素,如果找不到该元素,则返回 `null`。最后,我们使用 `orElse()` 方法来返回查询结果,如果找不到该元素,则返回 `null`。\\n\\n整个示例的输出结果为:\\n\\n```\\n查询结果: 苹果\\n查询结果2: null\\n```\\n\\n因此,我们可以看到内联查询 \"name\" 在两个不同数据类型的 ArrayList 之间是有效的。', 'history': [('用java实现一段业务逻辑，实现两个不同数据类型的ArrayList之间的内联查询，内联字段是name', '以下是一个用 Java 实现两个不同数据类型的 ArrayList 之间的内联查询的示例代码,其中内联字段是 \"name\":\\n\\n```java\\nimport java.util.ArrayList;\\n\\npublic class InlineQueryExample {\\n\\n    public static void main(String[] args) {\\n\\n        // 创建两个不同数据类型的 ArrayList\\n        ArrayList<String> stringList = new ArrayList<String>();\\n        ArrayList<Integer> integerList = new ArrayList<Integer>();\\n\\n        // 将字符串类型的 ArrayList 添加到另一个字符串类型的 ArrayList 中\\n        stringList.add(\"apple\");\\n        stringList.add(\"banana\");\\n        integerList.add(1);\\n        integerList.add(2);\\n\\n        // 查询字符串类型的 ArrayList 中包含 \"apple\" 的元素\\n        String result = stringList.stream().filter(str -> str.contains(\"apple\")).findFirst().orElse(\"没有找到该内联字段的数据\");\\n\\n        // 查询整数类型的 ArrayList 中包含 1 和 2 的元素\\n        int result2 = integerList.stream().filter(i -> i == 1 || i == 2).findFirst().orElse(null);\\n\\n        System.out.println(\"查询结果: \" + result);\\n        System.out.println(\"查询结果2: \" + result2);\\n    }\\n}\\n```\\n\\n在这个示例中,我们首先创建了两个不同数据类型的 ArrayList:`stringList` 和 `integerList`。然后,我们将字符串类型的 ArrayList 添加到另一个字符串类型的 ArrayList 中。\\n\\n接下来,我们使用 `stream()` 方法来创建一个查询字符串类型的 ArrayList 中包含 \"apple\" 的元素的 `StringFilter`。我们使用 `findFirst()` 方法来查找第一个元素,如果找不到该元素,则返回 \"没有找到该内联字段的数据\"。最后,我们使用 `orElse()` 方法来返回查询结果,如果找不到该内联字段的数据,则返回 `null`。\\n\\n然后,我们使用 `stream()` 方法来创建一个查询整数类型的 ArrayList 中包含 1 和 2 的元素的 `IntFilter`。我们使用 `findFirst()` 方法来查找第一个元素,如果找不到该元素,则返回 `null`。最后,我们使用 `orElse()` 方法来返回查询结果,如果找不到该元素,则返回 `null`。\\n\\n整个示例的输出结果为:\\n\\n```\\n查询结果: 苹果\\n查询结果2: null\\n```\\n\\n因此,我们可以看到内联查询 \"name\" 在两个不同数据类型的 ArrayList 之间是有效的。')]}\n"
     ]
    }
   ],
   "source": [
    "inputs = {'text':'用java实现一段业务逻辑，实现两个不同数据类型的ArrayList之间的内联查询，内联字段是name', 'history': result['history']}\n",
    "result = pipe(inputs)\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "id": "0dc6c5a2-944c-41de-ab26-e6a67b88159c",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'response': '农夫可以先将羊带到对岸,然后回来再把狼带到对岸,再回来把白菜带到对岸。\\n\\n具体步骤如下:\\n\\n1. 农夫先将羊带到对岸,然后回来再把狼带到对岸。\\n\\n2. 农夫把狼带到对岸后,再回来把羊带到对岸。\\n\\n3. 农夫把白菜带到对岸后,就成功过了河。\\n\\n在这个问题中,农夫需要特别小心,确保每次只让一种食物过河,以避免狼吃掉羊或羊吃掉白菜的情况发生。', 'history': [('一位农夫带着一头狼，一只羊和一筐白菜过河，河边有一条小船，农夫划船每次只能载狼、羊、白菜三者中的一个过河。农夫不在旁边时，狼会吃羊，羊会吃白菜。问农夫该如何过河。', '农夫可以先将羊带到对岸,然后回来再把狼带到对岸,再回来把白菜带到对岸。\\n\\n具体步骤如下:\\n\\n1. 农夫先将羊带到对岸,然后回来再把狼带到对岸。\\n\\n2. 农夫把狼带到对岸后,再回来把羊带到对岸。\\n\\n3. 农夫把白菜带到对岸后,就成功过了河。\\n\\n在这个问题中,农夫需要特别小心,确保每次只让一种食物过河,以避免狼吃掉羊或羊吃掉白菜的情况发生。')]}\n"
     ]
    }
   ],
   "source": [
    "inputs = {'text':'一位农夫带着一头狼，一只羊和一筐白菜过河，河边有一条小船，农夫划船每次只能载狼、羊、白菜三者中的一个过河。农夫不在旁边时，狼会吃羊，羊会吃白菜。问农夫该如何过河。', 'history': result['history']}\n",
    "result = pipe(inputs)\n",
    "print(result)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "id": "abd7c8ee-3b82-45d5-8c53-a2d7830f004f",
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Setting `pad_token_id` to `eos_token_id`:2 for open-end generation.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "{'response': '应该统计出停电户数:6。', 'history': [('\\n请统计一段对话中停电的户数有多少。\\n\\n例1:\\n```\\n张三: 怎么回事？突然断电了？\\n李四: 我家也断电了\\n王五: +1\\n傻大个: 没有啊，我家正常的啊\\n胖君子: 啊这，好累。\\n```\\n应该统计出停电户数:3。\\n\\n例2：\\n```\\n张三: 怎么回事？突然断电了？\\n李四: 我家没断电啊\\n王五: 没断电+1\\n傻大个: 我家也正常的啊\\n胖君子: 正常+1\\n```\\n应该统计出停电户数:1。\\n\\n请按照同样的规则统计下面这段对话的停电户数:\\n```\\n河马: 啦啦啦啦啦啦啦\\n小明: 怎么回事？突然断电了？\\n小芳: 我家也断电了\\n小华: +1\\n阿达: 没有啊，我家正常的啊\\n君莫笑: 啊这，好累。\\n小明: @管家，什么情况？什么时候能来电? \\n小华: 同问\\n彼岸花: 我家也停电了\\n鸽子: +1\\n大熊: +1\\n老鹰: 没停电的飘过。。。\\n管家: 正在联系供电局，请大家少安勿躁。\\n小芳: 最近经常停电啊，世界末日要来了，大家出来嗨吧～～～\\n屁屁: 还好我家没停。\\n谁家大爷: 没停电+1\\n胡萝卜: 没停电+1\\n管家: 正在联系供电局，请大家稍安勿躁。\\n```\\n', '应该统计出停电户数:6。')]}\n"
     ]
    }
   ],
   "source": [
    "inputs = {'text':'''\n",
    "请统计一段对话中停电的户数有多少。\n",
    "\n",
    "例1:\n",
    "```\n",
    "张三: 怎么回事？突然断电了？\n",
    "李四: 我家也断电了\n",
    "王五: +1\n",
    "傻大个: 没有啊，我家正常的啊\n",
    "胖君子: 啊这，好累。\n",
    "```\n",
    "应该统计出停电户数:3。\n",
    "\n",
    "例2：\n",
    "```\n",
    "张三: 怎么回事？突然断电了？\n",
    "李四: 我家没断电啊\n",
    "王五: 没断电+1\n",
    "傻大个: 我家也正常的啊\n",
    "胖君子: 正常+1\n",
    "```\n",
    "应该统计出停电户数:1。\n",
    "\n",
    "请按照同样的规则统计下面这段对话的停电户数:\n",
    "```\n",
    "河马: 啦啦啦啦啦啦啦\n",
    "小明: 怎么回事？突然断电了？\n",
    "小芳: 我家也断电了\n",
    "小华: +1\n",
    "阿达: 没有啊，我家正常的啊\n",
    "君莫笑: 啊这，好累。\n",
    "小明: @管家，什么情况？什么时候能来电? \n",
    "小华: 同问\n",
    "彼岸花: 我家也停电了\n",
    "鸽子: +1\n",
    "大熊: +1\n",
    "老鹰: 没停电的飘过。。。\n",
    "管家: 正在联系供电局，请大家少安勿躁。\n",
    "小芳: 最近经常停电啊，世界末日要来了，大家出来嗨吧～～～\n",
    "屁屁: 还好我家没停。\n",
    "谁家大爷: 没停电+1\n",
    "胡萝卜: 没停电+1\n",
    "管家: 正在联系供电局，请大家稍安勿躁。\n",
    "```\n",
    "''', 'history': result['history']}\n",
    "result = pipe(inputs)\n",
    "print(result)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3 (ipykernel)",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.16"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
